iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
1
  • noImplicitThis

不允許 this 隱式定義上下文, 例如以下程式碼

function getLabel(): string {   
   return this.label.toUpperCase();
}  

const config = {   
   label: 'Hello Typescript World',   
   getLabel 
} 

config.getLabel();

稍微粗心大意的人, 如果上面程式碼是用Javascript 會不知道發生甚麼錯誤. 但在Typescript 會告知你

'this' implicitly has type 'any' because it does not have a type annotation.

看出來了嗎? 上面 getLabel() 方法中, this.label 沒有宣告就進行使用 toUpperCase()

所以上面程式碼應該改成如下

const config = {   
   label: 'Hello Typescript World',
   getLabel(): string {     
      return this.label.toUpperCase();
   } 
};

但我們最好宣告這是甚麼類型, 最好是明確宣告介面, 更能確保程式碼可讀性, 以及正確性

interface IMyConfig {   
   label: string;
   getLabel: () => string;
}  

const config: IMyConfig = {   
   label: 'Hello Typescript World',
   getLabel() {     
     return this.label.toUpperCase();
   }
};
  • strictNullChecks
    檢查方法是否有可能回傳 null 或 undefined 的可能性
class PlayerInfo {
   id: number;
}
function getPlayerInfoById (data: PlayerInfo[], id: number): PlayerInfo {   
   const player = data.find(x => x.id === id);
   return player;
}

Typescript 會提醒以下錯誤訊息

Type 'PlayerInfo | undefined' is not assignable to type 'PlayerInfo'.
  Type 'undefined' is not assignable to type 'PlayerInfo'.

此時你就會知道 data.find() 有可能回傳 undefined 值, 所以你得修改程式碼如下

function getPlayerInfoById(data: PlayerInfo[], id: number): PlayerInfo {   
   const player = data.find(x => x.id === id);
   if (player === undefined) {     
      throw new Error(`Could not find an article with id: ${id}.`)   
   }    
   return player;
}

瞧! Typescript 多細心阿!

strictPropertyInitialization

要在構造函數(constructor)內部初始化, 或在構造之前已定義的類別中的屬性

看看下面的個例子

class Student {   
   name: string;
} 

Typescript 會顯示以下錯誤訊息, 告知 name 屬性沒有初值.

Property 'name' has no initializer and is not definitely assigned in the constructor.

所以在這模式下, 你必須對所有屬性做初始化, 不能甚麼都沒有

class Student {
   name: string = "";
}
  • strictBindCallApply

檢查你正在使用bind, call, apply 在方法中定義的參數類型和數量

以下範例示範 sum 方法

function sum (num1: number, num2: number): number {   
   return num1 + num2;
}  

sum.apply(null, (1, 2, 3));

Typescript 會找出你apply 傳入的參數有錯誤

Argument of type '3' is not assignable to parameter of type '[number, number]'.
Left side of comma operator is unused and has no side effects.

上述程式碼應該修正為

sum.apply(null, [1, 2]);

上一篇
Typescript 進階應用 - 23
下一篇
什麼是柯里化 - 25
系列文
為什麼世界需要Typescript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言